/*
 * TacticaCobian.java
 *
 * Created on 21 de abril de 2007, 11:57
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package futbol.tacticas.concursantes2007.CobianFC;

import futbol.tacticas.concursantes.Tactica;

import java.awt.Color;
import java.awt.Point;
import java.util.HashSet;
import java.util.Set;
import java.util.Vector;

import futbol.tacticas.Comando;
import futbol.tacticas.ComandoGolpearBola;
import futbol.tacticas.ComandoIrA;
import futbol.tacticas.ComandoTiroAPuerta;
import futbol.tacticas.SituacionJugadores;

/**
 *
 * @author Jorge Cobo Lpez
 * 
 * Visita mi WEB en http:\\cobian.freehostia.com
 */
public class TacticaCobian implements Tactica{
    
    /** Creates a new instance of TacticaCobian */
    public TacticaCobian() {
    }
    
    private Point balonTurnoAnterior = new Point();
    private Point balonTurnoSiguiente = new Point();
    
    //  Recta trazada por la pelota y=mx+n
    private double n;
    private double m;
    
    private double distanciaRecorridaBalonEjeX;
    private double distanciaRecorridaBalonEjeY;    
    
    private int nValores[][]={
        {-150,0,6}, // Jugador 1
        {-115,35,6}, // Jugador 2
        {-90,15,7}, // Jugador 3
        {-100,-15,7}, // Jugador 4      
        {-120,-40,6}, // Jugador 5
        {-50,0,5}, // Jugador 6
        {20,50,6}, // Jugador 7
        {10,-25,6}, // Jugador 8
        {45,-45,6}, // Jugador 9
        {120,30,6}, // Jugador 10
        {100,-30,6} // Jugador 11
    };

    public String getNombre() {
        return "Cobian F.C.";
    }

    public Color getColor1() {
    	return new Color(200,20,25);
//        return new Color(255,255,0);
    }

    public Color getColor2() {
    	return new Color(200,20,25);
//        return new Color(255,255,0);
    }

    public Color getColorNumero() {
    	return Color.BLACK;
//    	return new Color(255,000,153);
    }

    public int getFuerza(int n) {
        return nValores[n][2];
    }

    public int getXInicial(int n) {
        return nValores[n][0];
    }

    public int getYInicial(int n) {
        return nValores[n][1];
    }
    
    double situaVertical(Point bola, Point contrario, double x)
    {
        double m = 0;
        double b = 0;
        try
        {
            m = (bola.getY()-contrario.getY()) / (bola.getX()-contrario.getX());
            b = (contrario.getY() * bola.getX() - bola.getY() * contrario.getX()) / (bola.getX()-contrario.getX());
        }
        catch(Exception ex)
        {
        }
        return m*x + b;
    }
    
    public Vector<Comando> getComandos(SituacionJugadores sj){
        Vector<Comando> comandos = new Vector<Comando>();
        int portero = 0;
        //	AKI METO LOS JUGADORES QUE VOY TENIENDO COLOCADOS
        Set<Integer> jugadoresColocados = new HashSet<Integer>();
        Point bola=sj.getBola();
        
        //	CALCULO LA RECTA TRAZADA POR LA BOLA PARA CALCULAR SU POSIBLE POSICIN FUTURA (Y= mX + n).
        m = (bola.getY() - balonTurnoAnterior.getY())/(bola.getX() - balonTurnoAnterior.getX());
        n = bola.getY() - m * bola.getX();

        distanciaRecorridaBalonEjeX = bola.getX() - balonTurnoAnterior.getX();
        distanciaRecorridaBalonEjeY = bola.getY() - balonTurnoAnterior.getY();
        
        //	CALCULO LA POSIBLE SITUACIN DE LA BOLA EN EL SIGUIENTE TURNO
        balonTurnoSiguiente.setLocation(bola.getX()+distanciaRecorridaBalonEjeX,bola.getY()+distanciaRecorridaBalonEjeY);
        
        //	ASIGNO A BOLA, LA POSICIN QUE HE CALCULADO QUE TENDR EN EL SIGUIENTE TURNO
        bola = balonTurnoSiguiente;

        int jugMasCercano = sj.getMiJugadorMasCerca(bola.getX(), bola.getY());
        
        double y1 = m * nValores[portero][0] + n;
        // COLOCACION DEL PORTERO
        if(bola.getY() <= 35 && bola.getY() >= -35 ){
        	if(30 > y1 && y1 > -30){
        		comandos.add(new ComandoIrA(portero, nValores[portero][0], y1));
        	}else{
        		comandos.add(new ComandoIrA(portero, nValores[portero][0], bola.getY()));
        	}
        }else{
        	if(bola.getY() < 75 && bola.getY() > -75 && bola.getX()< -90 && jugMasCercano == portero){
        		//	LA BOLA EST EN EL AREA
                comandos.add(new ComandoIrA(portero, bola.getX() , bola.getY()));
            }else{
            	//	LA BOLA NO EST EN EL AREA
            	if(bola.getY() > 15 && bola.getY() < 35){
	                comandos.add(new ComandoIrA(portero, nValores[portero][0], 15));
	            }
	            if(bola.getY() < -15 && bola.getY() > -35){
	                comandos.add(new ComandoIrA(portero, nValores[portero][0], -15));
	            }
	            if(bola.getY() > 30){
	                comandos.add(new ComandoIrA(portero, nValores[portero][0], 10));
	            }
	            if(bola.getY() < -30){
	                comandos.add(new ComandoIrA(portero, nValores[portero][0], -10));
	            }
	            if(jugMasCercano == portero){
	            	//	OBTENGO MI JUGADOR MAS CERCANO A LA BOLA QUE NO SEA EL PORTERO
	            	double distanciaMinimaDeBola = 999999;
	            	for(int n=1;n<11;n++){
	            		double distanciaDeBola = sj.getMisJugadores()[n].distance(bola.getX(), bola.getY());
	            		if(distanciaDeBola < distanciaMinimaDeBola){
	            			distanciaMinimaDeBola = distanciaDeBola;
	            			jugMasCercano = n;
	            		}
	            	}
	            	comandos.add(new ComandoIrA(jugMasCercano, bola.getX(), bola.getY()));
	            }
            }
        }
        
        //	PONGO EL JUGADOR COMO YA COLOCADO.
        jugadoresColocados.add(new Integer(jugMasCercano));
	        
        //	PONGO LOS DEFENSAS A CUBRIR A LOS DELANTEROS
        for(int n=1;n<11;n++){
            if(jugMasCercano != n){
                if(sj.getContrario()[n].getX() <= 80){
                    int defMasCercano = sj.getMiJugadorMasCerca(sj.getContrario()[n].getX(),sj.getContrario()[n].getY());
                    if (defMasCercano <= 8 && defMasCercano != 0){
                        jugadoresColocados.add(new Integer(defMasCercano));
                        if(bola.getX() < sj.getContrario()[n].getX()+20){
                        	if(bola.getY() > 0){
                        		if(bola.getY() > sj.getContrario()[n].getY()){
                        			comandos.add(new ComandoIrA(defMasCercano, sj.getContrario()[n].getX() - 8,sj.getContrario()[n].getY()+3));
                        		}else{
                        			comandos.add(new ComandoIrA(defMasCercano, sj.getContrario()[n].getX() - 8,sj.getContrario()[n].getY()-3));
                        		}
                        	}else{
                        		if(bola.getY() < sj.getContrario()[n].getY()){
                        			comandos.add(new ComandoIrA(defMasCercano, sj.getContrario()[n].getX() - 8,sj.getContrario()[n].getY()-3));
                        		}else{
                        			comandos.add(new ComandoIrA(defMasCercano, sj.getContrario()[n].getX() - 8,sj.getContrario()[n].getY()+3));
                        		}
                        	}
                        }else{
                            if(bola.getY() > 0){
                        		if(bola.getY() > sj.getContrario()[n].getY()){
                        			comandos.add(new ComandoIrA(defMasCercano, sj.getContrario()[n].getX() + 8,sj.getContrario()[n].getY()+3));
                        		}else{
                        			comandos.add(new ComandoIrA(defMasCercano, sj.getContrario()[n].getX() + 8,sj.getContrario()[n].getY()-3));
                        		}
                        	}else{
                        		if(bola.getY() < sj.getContrario()[n].getY()){
                        			comandos.add(new ComandoIrA(defMasCercano, sj.getContrario()[n].getX() + 8,sj.getContrario()[n].getY()-3));
                        		}else{
                        			comandos.add(new ComandoIrA(defMasCercano, sj.getContrario()[n].getX() + 8,sj.getContrario()[n].getY()+3));
                        		}
                        	}
                        }
                    }
                }
            }
        }
        
        //	COLOCO A LOS JUGADORES POR ZONAS
        for(int n=1;n<11;n++){
            if(!jugadoresColocados.contains(n)){
                if( n==2 || n==3 || n==5 || n==7 ){
                    if(jugMasCercano != n){
                        if(bola.y < 30 && bola.y > -30){
                            comandos.add(new ComandoIrA(n, nValores[n][0],bola.y));
                        }
                    }
                }
                if( n==4 || n==8 || n==10){
                    if(jugMasCercano != n){
                        if(bola.y < 30){
                            comandos.add(new ComandoIrA(n, nValores[n][0],bola.y));
                        }
                    }
                }
                if( n==1 || n==6 || n==9 ){
                    if(jugMasCercano != n){
                        if(bola.y > 30){
                            comandos.add(new ComandoIrA(n, nValores[n][0],bola.y));
                        }
                    }
                }
            }
        }
        
        
        //	MOVIMIENTO GENERAL DE LOS JUGADORES
        if(bola.getX() <= 0){
            if(bola.getY() > 0){
                for(int n=1;n<11;n++){
                    if(jugMasCercano != n && !jugadoresColocados.contains(n)){
                        if(nValores[n][0] < 50 && nValores[n][1]  < 0){
                            comandos.add(new ComandoIrA(n, nValores[n][0] + 15, nValores[n][1] + 10));
                        }else{
                            if(nValores[n][0] < 50){
                                comandos.add(new ComandoIrA(n, nValores[n][0] + 15, nValores[n][1]));
                            }
                            if(nValores[n][1]  < 0){
                                comandos.add(new ComandoIrA(n, nValores[n][0], nValores[n][1] + 10));
                            }
                        }
                    }
                }
            }else{
                for(int n=1;n<11;n++){
                    if(jugMasCercano != n && !jugadoresColocados.contains(n)){
                        if(nValores[n][0] < 50 && nValores[n][1]  > 0){
                            comandos.add(new ComandoIrA(n, nValores[n][0] + 15, nValores[n][1] - 10));
                        }else{
                            if(nValores[n][0] < 50){
                                comandos.add(new ComandoIrA(n, nValores[n][0] + 15, nValores[n][1]));
                            }
                            if(nValores[n][1]  > 0){
                                comandos.add(new ComandoIrA(n, nValores[n][0], nValores[n][1] - 10));
                            }
                        }  
                    }
                }
            }
        }else{
            if(bola.getY() > 0){
                for(int n=1;n<11;n++){
                    if(jugMasCercano != n && !jugadoresColocados.contains(n)){
                        if(nValores[n][0] > 50 && nValores[n][1]  < 0){
                            comandos.add(new ComandoIrA(n, nValores[n][0] - 15, nValores[n][1] + 10));
                        }else{
                            if(nValores[n][0] > 50){
                                comandos.add(new ComandoIrA(n, nValores[n][0] - 15, nValores[n][1]));
                            }
                            if(nValores[n][1]  < 0){
                                comandos.add(new ComandoIrA(n, nValores[n][0], nValores[n][1] + 10));
                            }
                        } 
                    }
                }
            }else{
                for(int n=1;n<11;n++){
                    if(jugMasCercano != n && !jugadoresColocados.contains(n)){                    	
                        if(nValores[n][0] > 50 && nValores[n][1]  > 0){
                            comandos.add(new ComandoIrA(n, nValores[n][0] - 15, nValores[n][1] - 10));
                        }else{
                            if(nValores[n][0] > 50){
                                comandos.add(new ComandoIrA(n, nValores[n][0] - 15, nValores[n][1]));
                            }
                            if(nValores[n][1]  > 0){
                                comandos.add(new ComandoIrA(n, nValores[n][0], nValores[n][1] - 10));
                            }
                        }
                    }
                }
            }
        }

        //	EL JUGADOR MAS CERCANO VA A POR LA BOLA
       	comandos.add(new ComandoIrA(jugMasCercano, bola.getX() , bola.getY()));
        
        //	TIRAR A PUERTA
        for (int n=0;n<11;n++){
        	if(n == portero){
        		//	ES EL PORTERO
        		boolean despejar = false;
        		for(int c=0;c<11;c++){
    				if(sj.getContrario()[c].getY() < 75 && sj.getContrario()[c].getY() > -75 && sj.getContrario()[c].getX() < -40 ){
    					despejar = true;
    					break;
    				}        			
        		}
        		if(despejar){
        			if(sj.getMisJugadores()[portero].getY() >= 0){
        				comandos.add(new ComandoGolpearBola(portero,60,120));
        			}else{
        				comandos.add(new ComandoGolpearBola(portero,60,-120));
        			}	
        		}else{
        			//	TIRA A PUERTA, NO NECESITA DESPEJAR PQ NO HAY RIVALES DELANTE
        			comandos.add(new ComandoTiroAPuerta(portero,0));
        		}
        	}else{
        		//	ES UN JUGADOR
               	comandos.add(new ComandoTiroAPuerta(n,0));
        	}
        }
        //	Posicion real de la bola
        balonTurnoAnterior.setLocation(sj.getBola());
        return comandos;
    }
}
